#include<iostream>
using namespace std;
#include<unistd.h>
#include<string>
#include<sys/types.h>
#include<signal.h>
#include<stdlib.h>

void usege(const string& command)
{
    cout<<command<<"请加上pid和信号"<<endl;
    sleep(1);
}
int cnt = 1;

void catcher(int sign){
    cout<<"捕获到了信号:"<<sign<<endl;
    //sleep(1);
    //alarm(1);
}

int main(int argc,char* argv[]){

    //如果将所有的信号都自定义实现了，那么进程还能退出吗
    //可以，9号信号是管理员信号，不能被自定义实现
    for(int i = 1; i<32;i++){
        signal(i,catcher);
    }

    while(true){
        cout<<"我是进程，我正在运行"<<"pid"<<getpid()<<endl;
        sleep(1);
    }





    //五：核心转储的问题
    // while (true)
    // {
    //     int arr[10];
    //     arr[10000] = 1;//越界的问题
    // }
    










    //四：软件条件产生信号
    //1：前面进程间通信，使用管道文件的时候，如果把读端关闭，让写端一直写数据，那么操作系统会发送13号信号终止进程
    //2：alarm()闹钟：倒计时到了就会发送信号，默认动作是终止进程
    // signal(14,catcher);
    // alarm(1);//闹钟只会响一次
    
    // while(true){
    //    // cout<<"cnt:"<<cnt++<<endl;
    //    cnt++;
    // }






    //三：硬件异常产生信号
    //捕获异常
   // signal(8,catcher);//这里的第二个参数不是直接调用函数，而是捕获到了这个信号才去调用函数

    //为啥os会疯狂的发送异常信号呢？
    //答：收到信号，不一定会引起进程退出，没有退出，就还有可能别调度
    //cpu内部的寄存器只有一份，但是寄存器中的内容，属于当前进程的上下文
    //我们没有能力去修正这个问题
    //当进程被切换的时候，就有无数次状态寄存器被保存和恢复的过程
    //所以每一次恢复的时候，就让os识别到了cpu内部的状态寄存器中的溢出标志位是1
    // while(true){
    //     cout<<"我在运行中。。"<<endl;
    //     sleep(1);
    //     int a = 100;
    //     a = a / 0;//除0错误
    // }















    //二:系统调用向进程发送信号
    //1：kill()向任意进程发送任意信号
    //2：raise（）向自己进程发送任意信号
    //3: abort() 向自己进程发送指定6号信号

    // int cnt = 0;
    // while(cnt <= 10){
    //     cnt++;
    //     cout<<"进程正在运行"<<"cnt:"<<cnt<<endl;
    //     if(cnt == 5) abort();
    //     //使用kill来模拟实现
    //    // if(cnt == 5) kill(getpid(),SIGKILL);
    //     //if(cnt == 5) raise(9);
      
    //     sleep(1);
    // }


    //./test1 pid signo,实现这样的功能，必须输入pid和信号才能运行
    // if(argc != 3){
    //     usege(argv[0]);//传入我们输入的命令
    //     exit(1);
    // }

    // //通过键盘输入pid和信号，他们都是命令行参数，所以都存放在argv【】里面
    // pid_t pid = atoi(argv[1]);
    // int sig = atoi(argv[2]);

   // int n = kill(pid,sig);//执行成功返回0
   
    // if(n != 0){
    //     perror("kill");
    // }






    // while(true){
    //     cout<<"我是一个进程"<<endl;
    //     sleep(1);
    // }







    return 0;
}